package com.weilele.mvvm.utils.activity

import android.app.Activity
import android.content.Context
import android.content.res.Resources
import android.graphics.Rect
import android.graphics.drawable.Drawable
import android.view.Window
import androidx.annotation.*
import androidx.core.content.ContextCompat
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment
import com.weilele.mvvm.app
import com.weilele.mvvm.base.helper.appCompatActivity
import com.weilele.mvvm.utils.safeGet
import java.lang.reflect.Method

/**
 * 获取颜色值
 */
fun Any?.getResColor(@ColorRes colorRes: Int): Int {
    return when (this) {
        is Context -> {
            ContextCompat.getColor(this, colorRes)
        }
        is Fragment -> {
            ContextCompat.getColor(context ?: app, colorRes)
        }
        else -> {
            ContextCompat.getColor(app, colorRes)
        }
    }
}

/**
 * 获取字符串
 */
fun Any?.getResString(@StringRes stringRes: Int): CharSequence {
    return when (this) {
        is Context -> {
            getString(stringRes)
        }
        is Fragment -> {
            (context ?: app).getString(stringRes)
        }
        else -> {
            app.getString(stringRes)
        }
    }
}

/**
 * 获取图片
 */
fun Any?.getResDrawable(@DrawableRes drawableRes: Int): Drawable? {
    return when (this) {
        is Context -> {
            ContextCompat.getDrawable(this, drawableRes)
        }
        is Fragment -> {
            ContextCompat.getDrawable(context ?: app, drawableRes)
        }
        else -> {
            ContextCompat.getDrawable(app, drawableRes)
        }
    }
}

/**
 * 资源文件的bool值
 */
fun Any?.getResBool(@BoolRes boolRes: Int): Boolean? {
    return try {
        when (this) {
            is Context -> {
                this.resources.getBoolean(boolRes)
            }
            is Fragment -> {
                (this.context ?: app).resources.getBoolean(boolRes)
            }
            else -> {
                app.resources.getBoolean(boolRes)
            }
        }
    } catch (e: Throwable) {
        e.printStackTrace()
        null
    }
}

/**
 * 资源文件的像素值（dp->px）
 * 返回绝对像素 px
 *  getDimension()是基于当前DisplayMetrics进行转换，获取指定资源id对应的尺寸。
 *                文档里并没说这里返回的就是像素，要注意这个函数的返回值是float，像素肯定是int。
 *  getDimensionPixelSize()与getDimension()功能类似，
 *                不同的是将结果转换为int，并且小数部分四舍五入。
 *  getDimensionPixelOffset()与getDimension()功能类似，
 *                不同的是将结果转换为int，并且偏移转换（offset conversion，函数命名中的offset是这个意思）
 *                 是直接截断小数位，即取整（其实就是把float强制转化为int，注意不是四舍五入哦
 */
fun Any?.getResDimension(@DimenRes dimenRes: Int): Float {
    return try {
        when (this) {
            is Context -> {
                this.resources.getDimension(dimenRes)
            }
            is Fragment -> {
                (this.context ?: app).resources.getDimension(dimenRes)
            }
            else -> {
                app.resources.getDimension(dimenRes)
            }
        }
    } catch (e: Throwable) {
        e.printStackTrace()
        0f
    }
}

fun Any?.getResDimensionPixelSize(@DimenRes dimenRes: Int): Int {
    return try {
        when (this) {
            is Context -> {
                this.resources.getDimensionPixelSize(dimenRes)
            }
            is Fragment -> {
                (this.context ?: app).resources.getDimensionPixelSize(dimenRes)
            }
            else -> {
                app.resources.getDimensionPixelSize(dimenRes)
            }
        }
    } catch (e: Throwable) {
        e.printStackTrace()
        0
    }
}

data class ScreenInfo(
        val statusBarHeight: Int,
        val navigationBarHeight: Int,
        val statusBarShow: Boolean,
        val navigationBarShow: Boolean,
        val screenWidth: Int,
        val screenHeight: Int,
)

/**
 * 获取屏幕相关信息
 */
fun Activity.getScreenInfo(): ScreenInfo {
    return window.getScreenInfo()
}

/**
 * 获取屏幕相关信息
 */
fun Fragment.getScreenInfo(): ScreenInfo {
    return appCompatActivity!!.getScreenInfo()
}

/**
 * 获取屏幕相关信息
 */
fun Window.getScreenInfo(): ScreenInfo {
    val rect = Rect()
    decorView.getWindowVisibleDisplayFrame(rect)
    val statusBarHeight = rect.top
    val size = getScreenSize(false)
    val navigationBarHeight = size.y - rect.bottom
    return ScreenInfo(statusBarHeight, navigationBarHeight,
            statusBarHeight > 0,
            navigationBarHeight > 0,
            size.x, size.y)
}

